package cn.itcast.bos.web.action.base;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.springframework.data.domain.Page;

import cn.itcast.bos.domain.base.PageBean;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{
/**
 * 抽取action中共有的代码，简化开发
 */
	
	// 模型驱动
	protected T model;
	@Override
	public T getModel() {
		return model;
	}


	// 构造器，完成模型实例化
	public BaseAction() {
		// 构造子类Action对象，获得继承父类型的泛型
		// AreaAction extends BaseAction<Area>
		// BaseAction<Area>
		Type genericSuperclass = this.getClass().getGenericSuperclass();
		// 获取类型第一个泛型参数，得到父类对象的泛型参数，这个泛型参数可以以有多个
		ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
		Class<T> modelClass = (Class<T>) parameterizedType.getActualTypeArguments()[0];
		
		try {
			 model = modelClass.newInstance();
		} catch (InstantiationException | IllegalAccessException e) {
			e.printStackTrace();
			System.out.println("模型构造失败...");
		}
		
	}

	// 接受分页查询参数
	protected int page;
	protected int rows;

	public void setPage(int page) {
		this.page = page;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}
	
	
	// // 将分页查询结果数据，压入值栈的方法
	
	public void pushPageDataToValueStack(Page<T> page){

		PageBean<T> pageBean = new PageBean<T>();
		pageBean.setTotal(page.getTotalElements());
		pageBean.setRows(page.getContent());
		//pageBean.setRows((List<Area>) page.getContent());
		
		// 将数据压人值栈顶端
		ActionContext.getContext().getValueStack().push(pageBean);
		
		
	}

}
